home *** CD-ROM | disk | FTP | other *** search
/ Ultimedia 2 / Ultimedia 2.iso / tools / soundtools / quadracomp / qcfastreplay.s next >
Text File  |  1993-10-07  |  23KB  |  1,150 lines

  1. * This replayroutine was written by Bo Lincoln (Eternal).
  2. * Copyright © 1993 Technological Artwork. All rights reserved.
  3. * You may use this routine in your programs.
  4. * This is the fast-routine, i.e it uses level 6 interrupt to wait for
  5. * the dma. Worst case is about 8 rasterlines (tested with an average module).
  6. * How to use: Call QC_init to init the mod.
  7. *             Call QC_music every vertical blank.
  8. *             Call QC_end to stop.
  9. *             The EMOD should be at QC_data.
  10. * You can not use Tempo in this routine. (Then you have to put the whole
  11. * routine in the level 6 interrupt).
  12.               
  13.  
  14. QC_dmawait = 255
  15.  
  16. cia_CRA = $e00
  17. cia_ICR = $d00
  18. cia_TALO = $400
  19. cia_TAHI = $500
  20.  
  21.     section QC,code_c
  22. s:    move.w $dff01c,-(sp)
  23.     move.w #$7fff,$dff09a            ;Turn off all interrupts
  24.     bsr QC_init
  25. loop:    bsr QC_music
  26. loop2:    cmp.b #70,$dff006
  27.     bne loop2
  28. loop3:    cmp.b #70,$dff006
  29.     beq loop3
  30.     btst #6,$bfe001
  31.     bne loop
  32.     bsr QC_end
  33.     move.w (sp)+,d0
  34.     or.w #$8000,d0
  35.     move.w d0,$dff09a
  36.     rts
  37.  
  38. QC_init:lea QC_data(pc),a0        ;Check if the module is ok
  39.     cmp.l #"FORM",(a0)
  40.     bne QC_initerr
  41.     cmp.l #"EMOD",8(a0)
  42.     bne QC_initerr
  43.     cmp.l #"EMIC",12(a0)
  44.     bne QC_initerr
  45.     cmp.w #1,20(a0)
  46.     bne QC_initerr
  47.  
  48.     or.b #$2,$bfe001
  49.     moveq #0,d7        ;Get the adresses to the sampleinfos
  50.     move.b 63(a0),d7    ;and init the real adresses in the infos
  51.     subq #1,d7
  52.     lea 64(a0),a0
  53.     lea QC_samplepointers(pc),a1
  54. QC_sploop:moveq #0,d0
  55.     move.b (a0),d0
  56.     add.w d0,d0
  57.     add.w d0,d0
  58.     move.l a0,(a1,d0.w)
  59.     add.l #QC_data,30(a0)
  60.     move.l 30(a0),a2
  61.     clr.w (a2)
  62.     lea 34(a0),a0
  63.     dbf d7,QC_sploop
  64.  
  65.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  66.     moveq #0,d7
  67.     addq #1,a0
  68.     move.b (a0)+,d7
  69.     subq #1,d7
  70. QC_pploop:moveq #0,d0
  71.     move.b (a0),d0
  72.     add.w d0,d0
  73.     add.w d0,d0
  74.     move.l a0,(a1,d0.w)
  75.     add.l #QC_data,22(a0)
  76.     lea 26(a0),a0
  77.     dbf d7,QC_pploop
  78.  
  79.     move.l $78,QC_oldIrq
  80.     clr.w QC_nrofpos
  81.     move.b (a0)+,QC_nrofpos+1    
  82.     move.l a0,QC_posstart
  83.     moveq #0,d0
  84.     move.b (a0),d0
  85.     add.w d0,d0
  86.     add.w d0,d0
  87.     move.l (a1,d0.w),a1
  88.     move.l 22(a1),QC_currpattpointer    
  89.     move.b 1(a1),QC_breakrow+1
  90.     move.w #6,QC_speed
  91.     move.w QC_speed(pc),QC_speedcount
  92.     clr.b QC_newposflag
  93.     clr.w QC_rowcount
  94.     clr.w QC_pos
  95.     move.w #1,t_length+QC_chan1
  96.     move.w #1,t_length+QC_chan2
  97.     move.w #1,t_length+QC_chan3
  98.     move.w #1,t_length+QC_chan4
  99.     move.w #1,t_replen+QC_chan1
  100.     move.w #1,t_replen+QC_chan2
  101.     move.w #1,t_replen+QC_chan3
  102.     move.w #1,t_replen+QC_chan4
  103.     moveq #0,d0
  104. QC_end:    move.b #$7f,$bfd000+cia_ICR
  105.     move.w #$2000,$dff09a
  106.     move.w #$2000,$dff09c
  107.     move.l QC_oldirq,$78
  108.     move.w #$f,$dff096
  109.     clr.w $dff0a8
  110.     clr.w $dff0b8
  111.     clr.w $dff0c8
  112.     clr.w $dff0d8
  113.     rts        
  114. QC_initerr:moveq #-1,d0
  115.     rts
  116.  
  117. QC_music:
  118.     addq.w #1,QC_speedcount
  119.     move.w QC_speed,d0
  120.     cmp.w QC_speedcount,d0
  121.     bgt QC_nonew
  122.     tst.b QC_pattwait
  123.     beq QC_getnotes
  124.     subq.b #1,QC_pattwait
  125.     clr.w QC_speedcount
  126.  
  127. QC_nonew:lea QC_samplepointers(pc),a4
  128.     lea QC_periodtable(pc),a3
  129.     lea QC_chan1(pc),a6
  130.     lea $dff0a0,a5
  131.     bsr QC_chkplayfx
  132.     lea QC_chan2-QC_chan1(a6),a6
  133.     lea $10(a5),a5
  134.     bsr QC_chkplayfx
  135.     lea QC_chan2-QC_chan1(a6),a6
  136.     lea $10(a5),a5
  137.     bsr QC_chkplayfx
  138.     lea QC_chan2-QC_chan1(a6),a6
  139.     lea $10(a5),a5    
  140.     bsr QC_chkplayfx
  141.  
  142.     move.w QC_dmacon(pc),$dff096
  143.     beq QC_mend
  144.  
  145.     lea $bfd000,a0
  146.     move.b #$7f,cia_ICR(a0)
  147.     move.w #$2000,$dff09c
  148.     move.l #QC_setdma,$78.w
  149.     move.w #$e000,$dff09a
  150.     clr.b cia_CRA(a0)
  151.     move.b #QC_dmawait,cia_TALO(a0)
  152.     clr.b cia_TAHI(a0)
  153.     move.b #$11,cia_CRA(a0)
  154.     move.b #$81,cia_ICR(a0)
  155.     rts    
  156.  
  157. QC_chkplayfx:
  158.     lea QC_playfx(pc),a2
  159.     move.b t_cmd(a6),d0
  160.     and.w #$f,d0
  161.     add.w d0,d0    
  162.     add.w d0,d0    
  163.     move.l (a2,d0.w),a0
  164.     jmp (a0)    
  165.     
  166. QC_getnotes:
  167.     clr.w QC_speedcount
  168.     move.l QC_currpattpointer(pc),a0
  169.     move.w QC_rowcount(pc),d0
  170.     asl.w #4,d0
  171.     add.w d0,a0
  172.     lea QC_samplepointers(pc),a4
  173.     lea QC_periods(pc),a3
  174.     
  175.     lea $dff0a0,a5
  176.     lea QC_chan1(pc),a6
  177.     bsr QC_playnote
  178.     lea $10(a5),a5
  179.     lea QC_chan2-QC_chan1(a6),a6
  180.     bsr QC_playnote
  181.     lea $10(a5),a5
  182.     lea QC_chan2-QC_chan1(a6),a6
  183.     bsr QC_playnote
  184.     lea $10(a5),a5
  185.     lea QC_chan2-QC_chan1(a6),a6
  186.     bsr QC_playnote
  187.  
  188.     move.w QC_dmacon(pc),$dff096
  189.     beq QC_update
  190.  
  191.     lea $bfd000,a0
  192.     move.b #$7f,cia_ICR(a0)
  193.     move.w #$2000,$dff09c
  194.     move.w #$e000,$dff09a
  195.     move.l #QC_setdma,$78.w
  196.     clr.b cia_CRA(a0)
  197.     move.b #QC_dmawait,cia_TALO(a0)
  198.     clr.b cia_TAHI(a0)
  199.     move.b #$11,cia_CRA(a0)
  200.     move.b #$81,cia_ICR(a0)
  201.     
  202. QC_update:
  203. QC_tstnewpos:tst.b QC_newposflag
  204.     beq QC_tstend
  205.     clr.b QC_newposflag
  206.     move.w QC_newposnr,QC_pos
  207.     bra QC_newpos
  208. QC_tstend:tst.b QC_jumpbreakflag
  209.     beq QC_tstend2
  210.     clr.b QC_jumpbreakflag
  211.     move.w QC_looprow(pc),d0
  212.     cmp.w QC_breakrow(pc),d0
  213.     bgt QC_mend
  214.     move.w d0,QC_rowcount
  215.     rts
  216. QC_tstend2:    
  217.     addq.w #1,QC_rowcount
  218.     move.w QC_rowcount(pc),d0
  219.     cmp.w QC_breakrow(pc),d0
  220.     ble QC_mend
  221.     addq.w #1,QC_pos
  222. QC_newpos:move.w QC_pos(pc),d0
  223.     cmp.w QC_nrofpos(pc),d0
  224.     blt QC_getpos
  225.     clr.w QC_pos
  226.     moveq #0,d0
  227. QC_getpos:move.l QC_posstart(pc),a0
  228.     move.b (a0,d0.w),d0
  229.     add.w d0,d0
  230.     add.w d0,d0
  231.     lea QC_patternpointers(pc),a0
  232.     move.l (a0,d0.w),a0
  233.     move.l 22(a0),QC_currpattpointer
  234.     move.b 1(a0),QC_breakrow+1
  235.     move.w QC_newrow(pc),QC_rowcount
  236.     clr.w QC_newrow
  237. QC_mend:rts
  238.  
  239. QC_setDMA:
  240.     tst.b $bfd000+cia_ICR
  241.     or.w #$8000,QC_dmacon
  242.     move.w QC_dmacon(pc),$dff096
  243.     clr.w QC_dmacon
  244.     move.l #QC_fixloop,$78.w
  245.     move.w #$2000,$dff09c
  246.     rte
  247.  
  248. QC_fixloop:    
  249.     tst.b $bfd000+cia_ICR
  250.     move.l a5,-(sp)
  251.     move.l a0,-(sp)
  252.     lea $dff000,a5
  253.     lea QC_chan1+t_repeat(pc),a0
  254.     move.l (a0),$a0(a5)    
  255.     move.w 4(a0),$a4(a5)
  256.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  257.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  258.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  259.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  260.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  261.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  262.     clr.b $bfd000+cia_CRA
  263.     move.b #$7f,$bfd000+cia_ICR
  264.     move.w #$2000,$dff09a
  265.     move.w #$2000,$dff09c
  266.     move.l (sp)+,a0
  267.     move.l (sp)+,a5
  268.     rte    
  269.     
  270. QC_playnote:move.l (a0)+,(a6)
  271.     moveq #0,d0
  272.     move.b (a6),d0
  273.     beq QC_isnote
  274.     add.w d0,d0
  275.     add.w d0,d0
  276.     move.l (a4,d0.w),a1
  277.     move.b 1(a1),t_volume+1(a6)
  278.     move.b 25(a1),d0
  279.     and.w #$f,d0
  280.     add.w d0,d0
  281.     add.w d0,d0
  282.     move.l (a3,d0.w),t_finetune(a6)
  283.     move.l 30(a1),d1
  284.     move.l d1,t_start(a6)
  285.     move.w t_volume(a6),8(a5)
  286.     btst #0,24(a1)
  287.     beq QC_noloop
  288.     moveq #0,d0
  289.     move.w 26(a1),d0
  290.     add.l d0,d1
  291.     add.l d0,d1
  292.     move.l d1,t_repeat(a6)
  293.     moveq #0,d0
  294.     move.w 26(a1),d0
  295.     moveq #0,d1
  296.     move.w 28(a1),d1
  297.     add.l d0,d1
  298.     move.w d1,t_length(a6)
  299.     move.w 28(a1),t_replen(a6)
  300.     bra QC_isnote
  301. QC_noloop:clr.l t_repeat(a6)
  302.     move.w #$1,t_replen(a6)
  303.     move.w 2(a1),t_length(a6)
  304. QC_isnote:
  305.     tst.b t_notenr(a6)
  306.     blt QC_chkfirstfx
  307.     move.b t_notenr(a6),t_notenr2+1(a6)
  308.     move.w t_cmd(a6),d0
  309.     and.w #$ff0,d0
  310.     cmp.w #$e50,d0
  311.     beq QC_setfinetunefirst
  312.     and.w #$f00,d0
  313.     cmp.w #$300,d0
  314.     beq QC_settoneport
  315.     cmp.w #$500,d0
  316.     beq QC_settoneport
  317. QC_getper:move.w t_notenr2(a6),d0
  318.     add.w d0,d0
  319.     move.l t_finetune(a6),a2
  320.     move.w (a2,d0.w),t_period(a6)
  321.     move.w t_cmd(a6),d0
  322.     and.w #$ff0,d0
  323.     cmp.w #$ed0,d0
  324.     beq QC_notedelay
  325.     move.w t_dmabit(a6),d0
  326.     or.w d0,QC_dmacon
  327.     move.l t_start(a6),(a5)
  328.     move.w t_length(a6),4(a5)
  329.     move.w t_period(a6),6(a5)
  330. QC_chkfirstfx:
  331.     lea QC_fxaftersetperiod(pc),a2
  332.     moveq #0,d0
  333.     move.b t_cmd(a6),d0
  334.     add.w d0,d0
  335.     add.w d0,d0
  336.     move.l (a2,d0.w),a2
  337.     jmp (a2)
  338.  
  339.  
  340. QC_setfinetunefirst:
  341.     moveq #0,d0
  342.     move.b t_cmdarg(a6),d0
  343.     add.w d0,d0
  344.     add.w d0,d0
  345.     move.l (a3,d0.w),t_finetune(a6)
  346.     bra QC_getper
  347.             
  348. QC_ecommands:
  349.     lea QC_efx(pc),a2
  350.     move.b t_cmdarg(a6),d0
  351.     and.w #$f0,d0
  352.     lsr.w #2,d0
  353.     move.l (a2,d0.w),a2
  354.     jmp (a2) 
  355.  
  356. QC_playecommands:
  357.     lea QC_playefx(pc),a2
  358.     move.b t_cmdarg(a6),d0
  359.     and.w #$f0,d0
  360.     lsr.w #2,d0
  361.     move.l (a2,d0.w),a2
  362.     jmp (a2) 
  363.  
  364. ********** Effect commands **********
  365.  
  366. QC_arpeggio:
  367.     tst.b t_cmdarg(a6)
  368.     beq QC_mend
  369.     move.w QC_speedcount,d0
  370.     lea QC_arptbl,a2
  371.     tst.b (a2,d0.w)
  372.     beq QC_arp2
  373.     blt QC_arp1
  374.     move.b t_cmdarg(a6),d0
  375.     and.w #$f,d0
  376.     add.w t_notenr2(a6),d0
  377.     add.w d0,d0
  378.     move.l t_finetune(a6),a2    
  379.     move.w (a2,d0.w),6(a5)    
  380.     rts
  381. QC_arp1:move.w t_period(a6),6(a5)
  382.     rts
  383. QC_arp2:moveq #0,d0
  384.     move.b t_cmdarg(a6),d0
  385.     lsr.w #4,d0
  386.     add.w t_notenr2(a6),d0
  387.     add.w d0,d0    
  388.     move.l t_finetune(a6),a2
  389.     move.w (a2,d0.w),6(a5)    
  390.     rts
  391.  
  392. QC_slideup:
  393.     moveq #0,d0            
  394.     move.b t_cmdarg(a6),d0        
  395.     sub.w d0,t_period(a6)        
  396.     cmp.w #113,t_period(a6)        
  397.     bgt QC_sunotlow
  398.     move.w #113,t_period(a6)
  399. QC_sunotlow:
  400.     move.w t_period(a6),6(a5)
  401.     rts    
  402.  
  403. QC_slidedown:
  404.     moveq #0,d0
  405.     move.b t_cmdarg(a6),d0
  406.     add.w d0,t_period(a6)
  407.     cmp.w #856,t_period(a6)
  408.     blt QC_sdnothigh
  409.     move.w #856,t_period(a6)
  410. QC_sdnothigh:
  411.     move.w t_period(a6),6(a5)
  412.     rts    
  413.  
  414. QC_settoneport:
  415.     move.w t_notenr2(a6),d0
  416.     add.w d0,d0
  417.     move.l t_finetune(a6),a2
  418.     move.w (a2,d0.w),d0
  419.     move.w d0,t_wantedperiod(a6)
  420.     cmp.w t_period(a6),d0    
  421.     bgt QC_setportdown
  422.     clr.b t_portdir(a6)
  423.     rts
  424. QC_setportdown:
  425.     move.b #1,t_portdir(a6)
  426.     rts    
  427.  
  428. QC_toneport:
  429.     tst.w t_wantedperiod(a6)
  430.     beq QC_mend
  431.     moveq #0,d0
  432.     move.b t_cmdarg(a6),d0
  433.     beq QC_tpold
  434.     move.b d0,t_portspeed(a6)
  435.     tst.b t_portdir(a6)
  436.     bne QC_portdown
  437.     sub.w d0,t_period(a6)
  438.     move.w t_wantedperiod(a6),d0
  439.     cmp.w t_period(a6),d0
  440.     blt QC_notyetwanted
  441.     move.w d0,6(a5)
  442.     move.w d0,t_period(a6)
  443.     clr.w t_wantedperiod(a6)
  444.     rts
  445. QC_tpold:move.b t_portspeed(a6),d0
  446.     tst.b t_portdir(a6)
  447.     bne QC_portdown
  448.     sub.w d0,t_period(a6)
  449.     move.w t_wantedperiod(a6),d0
  450.     cmp.w t_period(a6),d0
  451.     blt QC_notyetwanted
  452.     move.w d0,6(a5)
  453.     move.w d0,t_period(a6)
  454.     clr.w t_wantedperiod(a6)
  455.     rts
  456. QC_portdown:
  457.     add.w d0,t_period(a6)
  458.     move.w t_wantedperiod(a6),d0
  459.     cmp.w t_period(a6),d0
  460.     bgt QC_notyetwanted
  461.     move.w d0,6(a5)
  462.     move.w d0,t_period(a6)
  463.     clr.w t_wantedperiod(a6)
  464.     rts
  465. QC_notyetwanted:
  466.     tst.b t_glisscont(a6)
  467.     beq QC_nogliss
  468.     move.l t_finetune(a6),a2
  469.     move.w t_period(a6),d0
  470. QC_glissloop:
  471.     cmp.w (a2)+,d0
  472.     blt QC_glissloop
  473.     move.w -2(a2),6(a5)
  474.     rts
  475. QC_nogliss:
  476.     move.w t_period(a6),6(a5)
  477.     rts
  478.     
  479. QC_vibrato:
  480.     moveq #0,d0
  481.     move.b t_vibwave(a6),d0
  482.     asl.w #7,d0
  483.     lea QC_vibtables(pc),a2
  484.     add.w d0,a2
  485.     moveq #0,d0
  486.     move.b t_cmdarg(a6),d0
  487.     beq QC_vib    
  488.     move.w d0,d1
  489.     and.b #$f,d0
  490.     beq QC_vibusespeed
  491.     and.b #$f0,t_vibcmd(a6)
  492.     or.b d0,t_vibcmd(a6)
  493. QC_vibusespeed:
  494.     and.b #$f0,d1
  495.     beq QC_vib
  496.     and.b #$f,t_vibcmd(a6)
  497.     or.b d1,t_vibcmd(a6)
  498. QC_vib:    move.b t_vibcmd(a6),d0
  499.     lsr.w #3,d0
  500.     add.w d0,t_vibpos(a6)
  501.     and.w #$7e,t_vibpos(a6)
  502.     move.w t_vibpos(a6),d0
  503.     move.w t_period(a6),d1
  504.     move.w (a2,d0.w),d0
  505.     move.b t_vibcmd(a6),d2
  506.     and.w #$f,d2
  507.     muls d2,d0
  508.     add.l d0,d0
  509.     add.l d0,d0
  510.     swap d0
  511.     add.w d0,d1
  512.     cmp.w #856,d1
  513.     blt QC_vibnothigh
  514.     move.w #856,d1
  515. QC_vibnothigh:
  516.     cmp.w #113,d1
  517.     bgt QC_vibnotlow
  518.     moveq #113,d1
  519. QC_vibnotlow:
  520.     move.w d1,6(a5)
  521.     rts    
  522.  
  523. QC_toneportandvolslide:
  524.     tst.w t_wantedperiod(a6)
  525.     beq QC_volslide
  526.     bsr QC_tpold
  527.     bra QC_volslide
  528.  
  529. QC_vibratoandvolslide:
  530.     bsr QC_vib
  531.     bra QC_volslide
  532.  
  533. QC_tremolo:
  534.     moveq #0,d0
  535.     move.b t_tremwave(a6),d0
  536.     asl.w #7,d0
  537.     lea QC_vibtables(pc),a2
  538.     add.w d0,a2
  539.     moveq #0,d0
  540.     move.b t_cmdarg(a6),d0
  541.     beq QC_trem    
  542.     move.w d0,d1
  543.     and.b #$f,d0
  544.     beq QC_tremusespeed
  545.     and.b #$f0,t_tremcmd(a6)
  546.     or.b d0,t_tremcmd(a6)
  547. QC_tremusespeed:
  548.     and.b #$f0,d1
  549.     beq QC_trem
  550.     and.b #$f,t_tremcmd(a6)
  551.     or.b d1,t_tremcmd(a6)
  552. QC_trem:move.b t_tremcmd(a6),d0
  553.     lsr.w #3,d0
  554.     add.w d0,t_trempos(a6)
  555.     and.w #$7e,t_trempos(a6)
  556.     move.w t_trempos(a6),d0
  557.     move.w t_volume(a6),d1
  558.     move.w (a2,d0.w),d0
  559.     move.b t_tremcmd(a6),d2
  560.     and.w #$f,d2
  561.     muls d2,d0
  562.     asl.l #3,d0
  563.     swap d0
  564.     add.w d0,d1
  565.     cmp.w #40,d1
  566.     blt QC_tremnothigh
  567.     move.w #40,d1
  568. QC_tremnothigh:
  569.     tst.w d1
  570.     bgt QC_tremnotlow
  571.     moveq #0,d1
  572. QC_tremnotlow:
  573.     move.w d1,8(a5)
  574.     rts    
  575.  
  576. QC_sampleoffset:
  577.     moveq #0,d0
  578.     move.b t_cmdarg(a6),d0
  579.     beq QC_sook
  580.     move.b d0,t_sampleoffset(a6)
  581. QC_sook:move.b t_sampleoffset(a6),d0
  582.     asl.w #8,d0
  583.     moveq #0,d1
  584.     move.w t_length(a6),d1
  585.     sub.l d0,d1
  586.     ble QC_sotoolong
  587.     move.w d1,t_length(a6)
  588.     add.l d0,d0
  589.     add.l d0,t_start(a6)
  590.     move.l t_start(a6),(a5)
  591.     move.w t_length(a6),4(a5)
  592.     rts
  593. QC_sotoolong:
  594.     move.w #1,t_length(a6)
  595.     move.w t_length(a6),4(a5)
  596.     rts
  597.     
  598. QC_volslide:
  599.     moveq #0,d0
  600.     move.b t_cmdarg(a6),d0
  601.     lsr.w #4,d0
  602.     beq QC_volslidedown
  603.     add.w d0,t_volume(a6)
  604.     cmp.w #$40,t_volume(a6)    
  605.     blt QC_setvol
  606.     move.w #$40,t_volume(a6)
  607. QC_setvol:move.w t_volume(a6),8(a5)
  608.     rts
  609. QC_volslidedown:
  610.     move.b t_cmdarg(a6),d0
  611.     sub.w d0,t_volume(a6)
  612.     tst.w t_volume(a6)    
  613.     bgt QC_setvol
  614.     clr.w t_volume(a6)
  615.     clr.w 8(a5)
  616.     rts        
  617.  
  618. QC_posjump:
  619.     move.b t_cmdarg(a6),QC_newposnr+1
  620.     move.b #1,QC_newposflag
  621.     clr.w QC_newrow
  622.     rts        
  623.  
  624. QC_volumechange:
  625.     move.b t_cmdarg(a6),d0
  626.     cmp.b #$40,d0
  627.     blo QC_volchhigh
  628.     move.w #$40,t_volume(a6)
  629.     move.w #$40,8(a5)
  630.     rts
  631. QC_volchhigh:
  632.     move.b d0,t_volume+1(a6)
  633.     move.w t_volume(a6),8(a5)
  634.     rts
  635.  
  636. QC_patternbreak:
  637.     move.w QC_pos,d0
  638.     addq.w #1,d0
  639.     move.w d0,QC_newposnr
  640.     move.b t_cmdarg(a6),QC_newrow+1
  641.     move.b #1,QC_newposflag
  642.     rts
  643.  
  644. QC_setspeed:
  645.     move.b t_cmdarg(a6),d0
  646.     beq QC_setspeed1
  647.     cmp.b #$1f,d0
  648.     bhi QC_end
  649.     move.b d0,QC_speed+1
  650.     clr.w QC_speedcount
  651.     rts
  652. QC_setspeed1:
  653.     move.w #1,QC_speed
  654.     clr.w QC_speedcount
  655.     rts
  656.  
  657. QC_setfilter:
  658.     move.b t_cmdarg(a6),d0
  659.     and.b #1,d0
  660.     add.b d0,d0
  661.     and.b #$fd,$bfe001
  662.     or.b d0,$bfe001
  663.     rts
  664.  
  665. QC_fineslideup:
  666.     move.b t_cmdarg(a6),d0
  667.     and.w #$f,d0
  668.     sub.w d0,t_period(a6)
  669.     cmp.w #113,t_period(a6)
  670.     bgt QC_fsunotlow
  671.     move.w #113,t_period(a6)
  672. QC_fsunotlow:
  673.     move.w t_period(a6),6(a5)
  674.     rts
  675.  
  676. QC_fineslidedown:
  677.     move.b t_cmdarg(a6),d0
  678.     and.w #$f,d0
  679.     add.w d0,t_period(a6)
  680.     cmp.w #856,t_period(a6)
  681.     blt QC_fsdnothigh
  682.     move.w #856,t_period(a6)
  683. QC_fsdnothigh:
  684.     move.w t_period(a6),6(a5)
  685.     rts    
  686.     
  687. QC_glisscontrol:
  688.     move.b t_cmdarg(a6),t_glisscont(a6)
  689.     and.b #$f,t_glisscont(a6)
  690.     rts
  691.  
  692. QC_vibratowave:
  693.     move.b t_cmdarg(a6),t_vibwave(a6)
  694.     and.b #$f,t_vibwave(a6)
  695.     rts
  696.  
  697. QC_finetune:
  698.     move.b t_cmdarg(a6),d0
  699.     and.w #$f,d0
  700.     add.w d0,d0
  701.     add.w d0,d0
  702.     move.l (a3,d0.w),t_finetune(a6)
  703.     rts
  704.     
  705. QC_jumploop:
  706.     move.b t_cmdarg(a6),d0
  707.     and.w #$f,d0
  708.     beq QC_saveloop
  709.     tst.b QC_loopcount
  710.     beq QC_saveloop
  711.     subq.b #1,QC_loopcount
  712.     beq QC_mend
  713.     move.b #1,QC_jumpbreakflag
  714.     rts    
  715. QC_newloop:
  716.     move.b d0,QC_loopcount
  717.     move.b #1,QC_jumpbreakflag
  718.     rts    
  719. QC_saveloop:
  720.     move.w QC_rowcount(pc),QC_looprow
  721.     rts
  722.  
  723. QC_tremolowave:
  724.     move.b t_cmdarg(a6),t_tremwave(a6)
  725.     and.b #$f,t_tremwave(a6)
  726.     rts
  727.  
  728. QC_initretrig:
  729.     clr.b t_retrig(a6)
  730. QC_retrignote:
  731.     addq.b #1,t_retrig(a6)
  732.     move.b t_cmdarg(a6),d0
  733.     and.b #$f,d0
  734.     cmp.b t_retrig(a6),d0
  735.     bgt QC_mend
  736.     clr.b t_retrig(a6)
  737.     move.w t_dmabit(a6),d0
  738.     or.w d0,QC_dmacon
  739.     move.l t_start(a6),(a5)
  740.     move.w t_length(a6),4(a5)
  741.     move.w t_period(a6),6(a5)
  742.     rts
  743.  
  744. QC_volumefineup:
  745.     move.b t_cmdarg(a6),d0
  746.     and.w #$f,d0
  747.     add.w d0,t_volume(a6)
  748.     cmp.w #$40,t_volume(a6)
  749.     blt QC_vfuset
  750.     move.w #$40,t_volume(a6)
  751.     move.w #$40,8(a5)
  752.     rts
  753. QC_vfuset:move.w t_volume(a6),8(a5)
  754.     rts    
  755.  
  756. QC_volumefinedown:
  757.     move.b t_cmdarg(a6),d0
  758.     and.w #$f,d0
  759.     sub.w d0,t_volume(a6)
  760.     bge QC_vfdset
  761.     clr.w t_volume(a6)
  762.     clr.w 8(a5)
  763.     rts
  764. QC_vfdset:move.w t_volume(a6),8(a5)
  765.     rts    
  766.  
  767. QC_notecut:
  768.     moveq #0,d1
  769.     move.b t_cmdarg(a6),d1
  770.     and.b #$f,d1
  771.     cmp.w QC_speedcount(pc),d1
  772.     bgt QC_mend
  773.     clr.w t_volume(a6)
  774.     clr.w 8(a5)
  775.     rts
  776.  
  777. QC_notedelay:
  778.     moveq #0,d1
  779.     move.b t_cmdarg(a6),d1
  780.     and.b #$f,d1
  781.     cmp.w QC_speedcount(pc),d1
  782.     bne QC_mend
  783.     move.w t_dmabit(a6),d0
  784.     or.w d0,QC_dmacon
  785.     move.l t_start(a6),(a5)
  786.     move.w t_length(a6),4(a5)
  787.     move.w t_period(a6),6(a5)
  788.     rts
  789.  
  790. QC_patterndelay:
  791.     move.b t_cmdarg(a6),QC_pattwait
  792.     and.b #$f,QC_pattwait
  793.     rts
  794.  
  795. QC_arptbl:rept 86        ;if your assembler doensn't want to handle
  796.     dc.b -1,0,1        ;the "rept" command, you'll have to write
  797.     endr            ;a list incl. 256 numbers like this:
  798.                 ;-1,0,1,-1,0,1,-1.. and so on.
  799.  
  800.  
  801. QC_playfx:dc.l QC_arpeggio
  802.     dc.l QC_slideup
  803.     dc.l QC_slidedown
  804.     dc.l QC_toneport
  805.     dc.l QC_vibrato
  806.     dc.l QC_toneportandvolslide
  807.     dc.l QC_vibratoandvolslide
  808.     dc.l QC_tremolo
  809.     dc.l QC_mend
  810.     dc.l QC_mend
  811.     dc.l QC_volslide
  812.     dc.l QC_mend
  813.     dc.l QC_mend
  814.     dc.l QC_mend
  815.     dc.l QC_playecommands    
  816.     dc.l QC_mend
  817.  
  818. QC_playefx:dc.l QC_mend
  819.     dc.l QC_mend
  820.     dc.l QC_mend
  821.     dc.l QC_mend
  822.     dc.l QC_mend
  823.     dc.l QC_mend
  824.     dc.l QC_mend
  825.     dc.l QC_mend
  826.     dc.l QC_mend
  827.     dc.l QC_retrignote
  828.     dc.l QC_mend
  829.     dc.l QC_mend
  830.     dc.l QC_notecut
  831.     dc.l QC_notedelay
  832.     dc.l QC_mend
  833.     dc.l QC_mend
  834.  
  835. QC_efx:    dc.l QC_setfilter
  836.     dc.l QC_fineslideup
  837.     dc.l QC_fineslidedown
  838.     dc.l QC_glisscontrol
  839.     dc.l QC_vibratowave
  840.     dc.l QC_finetune
  841.     dc.l QC_jumploop
  842.     dc.l QC_tremolowave
  843.     dc.l QC_mend
  844.     dc.l QC_initretrig
  845.     dc.l QC_volumefineup
  846.     dc.l QC_volumefinedown
  847.     dc.l QC_notecut
  848.     dc.l QC_notedelay
  849.     dc.l QC_patterndelay
  850.     dc.l QC_mend
  851.     
  852.  
  853. QC_fxaftersetperiod:
  854.     dc.l QC_arpeggio
  855.     dc.l QC_mend
  856.     dc.l QC_mend
  857.     dc.l QC_mend
  858.     dc.l QC_mend
  859.     dc.l QC_mend
  860.     dc.l QC_mend
  861.     dc.l QC_mend
  862.     dc.l QC_mend
  863.     dc.l QC_sampleoffset
  864.     dc.l QC_mend
  865.     dc.l QC_posjump
  866.     dc.l QC_volumechange
  867.     dc.l QC_patternbreak
  868.     dc.l QC_ecommands
  869.     dc.l QC_setspeed        
  870.  
  871.  
  872. QC_vibtables:
  873.     dc.w 0,3211,6392,9511,12539,15446,18204,20787,23169,25329
  874.     dc.w 27244,28897,30272,31356,32137,32609,32767,32609,32137
  875.     dc.w 31356,30272,28897,27244,25329,23169,20787,18204,15446
  876.     dc.w 12539,9511,6392,3211
  877.     dc.w 0,-3211,-6392,-9511,-12539,-15446,-18204,-20787,-23169,-25329
  878.     dc.w -27244,-28897,-30272,-31356,-32137,-32609,-32767,-32609,-32137
  879.     dc.w -31356,-30272,-28897,-27244,-25329,-23169,-20787,-18204,-15446
  880.     dc.w -12539,-9511,-6392,-3211
  881.  
  882.     dc.w 32767,31744,30720,29696,28672,27648,26624,25600,24576,23552
  883.     dc.w 22528,21504,20480,19456,18432,17408,16384,15360,14336,13312
  884.     dc.w 12288,11264,10240,9216,8192,7168,6144,5120,4096,3072,2048,1024
  885.     dc.w 0,-1024,-2048,-3072,-4096,-5120,-6144,-8168,-8192,-9216,-10240
  886.     dc.w -11264,-12288,-13312,-14336,-15360,-16384,-17408,-18432,-19456
  887.     dc.w -20480,-21504,-22528,-23552,-24576,-25600,-26624,-27648,-28672
  888.     dc.w -29696,-30720,-31744,-32768
  889.  
  890.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  891.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  892.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  893.     dc.w 32767,32767
  894.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  895.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  896.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  897.     dc.w -32767,-32767
  898.     
  899.  
  900.  
  901.  
  902. QC_periods:dc.l QC_periodtable
  903.     dc.l QC_periodtable+72
  904.     dc.l QC_periodtable+144
  905.     dc.l QC_periodtable+216
  906.     dc.l QC_periodtable+288
  907.     dc.l QC_periodtable+360
  908.     dc.l QC_periodtable+432
  909.     dc.l QC_periodtable+504
  910.     dc.l QC_periodtable+576
  911.     dc.l QC_periodtable+648
  912.     dc.l QC_periodtable+720
  913.     dc.l QC_periodtable+792
  914.     dc.l QC_periodtable+864
  915.     dc.l QC_periodtable+936
  916.     dc.l QC_periodtable+1008
  917.     dc.l QC_periodtable+1080
  918.  
  919.  
  920. QC_periodtable:
  921.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  922.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  923.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  924.  
  925.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  926.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  927.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  928.  
  929.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  930.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  931.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  932.  
  933.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  934.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  935.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  936.  
  937.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  938.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  939.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  940.  
  941.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  942.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  943.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  944.  
  945.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  946.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  947.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  948.  
  949.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  950.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  951.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  952.  
  953.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  954.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  955.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  956.  
  957.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  958.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  959.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  960.  
  961.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  962.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  963.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  964.  
  965.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  966.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  967.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  968.  
  969.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  970.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  971.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  972.  
  973.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  974.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  975.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  976.  
  977.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  978.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  979.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  980.  
  981.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  982.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  983.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  984.  
  985.  
  986. QC_samplepointers:
  987.     blk.l 256,QC_quietsamp    
  988. QC_patternpointers:
  989.     blk.l 256,0
  990. QC_currpattpointer:dc.l 0
  991. QC_posstart:dc.l 0
  992. QC_nrofpos:dc.w 0
  993. QC_pos:    dc.w 0
  994. QC_speed:dc.w 6
  995. QC_speedcount:dc.w 0
  996. QC_breakrow:dc.w 0
  997. QC_newrow:dc.w 0
  998. QC_newposnr:dc.w 0
  999. QC_rowcount:dc.w 0
  1000. QC_quiet:dc.w 0
  1001. QC_dmacon:dc.w 0
  1002. QC_looprow:dc.w 0
  1003. QC_tempo:dc.w 125
  1004. QC_oldirq:dc.l 0
  1005. QC_newposflag:dc.b 0
  1006. QC_jumpbreakflag:dc.b 0
  1007. QC_loopcount:dc.b 0
  1008. QC_pattwait:dc.b 0
  1009.  
  1010. QC_quietsamp:
  1011.     dc.w 0,1
  1012.     blk.b 20
  1013.     dc.w 0
  1014.     dc.w 1
  1015.     dc.l QC_quiet
  1016.  
  1017.  
  1018.  
  1019. t_notenr = 1
  1020. t_cmd = 2
  1021. t_cmdarg = 3
  1022. t_repeat = 4
  1023. t_replen = 8
  1024. t_period = 10
  1025. t_volume = 12
  1026. t_length = 14
  1027. t_finetune = 42
  1028. t_start = 18
  1029. t_dmabit = 22
  1030. t_notenr2 = 24
  1031. t_wantedperiod = 26
  1032. t_portdir = 28
  1033. t_vibwave = 29
  1034. t_glisscont = 30
  1035. t_vibcmd = 31
  1036. t_vibpos = 32
  1037. t_tremwave = 34
  1038. t_tremcmd = 35
  1039. t_trempos = 36
  1040. t_sampleoffset = 38
  1041. t_retrig = 39
  1042. t_portspeed = 40
  1043.     even
  1044. QC_chan1:dc.l 0            ;The note and command
  1045.     dc.l 0            ;Repeat
  1046.     dc.w 0            ;Replen
  1047.     dc.w 0            ;Period
  1048.     dc.w 0            ;Volume
  1049.     dc.w 0            ;Length
  1050.     dc.w 0            ;Finetune
  1051.     dc.l 0            ;Start
  1052.     dc.w 1            ;DMAbit
  1053.     dc.w 0            ;NoteNr2
  1054.     dc.w 0            ;WantedPeriod
  1055.     dc.b 0            ;Portdir
  1056.     dc.b 0            ;VibWave
  1057.     dc.b 0            ;Glisscont
  1058.     dc.b 0            ;Vibcmd
  1059.     dc.w 0            ;VibPos
  1060.     dc.b 0            ;Tremwave
  1061.     dc.b 0            ;Tremcmd
  1062.     dc.w 0            ;Trempos
  1063.     dc.b 0            ;Sampleoffset
  1064.     dc.b 0            ;Retrig
  1065.     dc.b 0            ;Portspeed
  1066.     dc.b 0            ;
  1067.     dc.l 0            ;FineTune
  1068.  
  1069.     even
  1070. QC_chan2:dc.l 0
  1071.     dc.l 0
  1072.     dc.w 0
  1073.     dc.w 0
  1074.     dc.w 0
  1075.     dc.w 0
  1076.     dc.w 0
  1077.     dc.l 0
  1078.     dc.w 2
  1079.     dc.w 0
  1080.     dc.w 0
  1081.     dc.b 0
  1082.     dc.b 0
  1083.     dc.b 0
  1084.     dc.b 0
  1085.     dc.w 0
  1086.     dc.b 0
  1087.     dc.b 0
  1088.     dc.w 0
  1089.     dc.b 0
  1090.     dc.b 0
  1091.     dc.b 0
  1092.     dc.b 0
  1093.     dc.l 0
  1094.  
  1095.     even
  1096. QC_chan3:dc.l 0
  1097.     dc.l 0
  1098.     dc.w 0
  1099.     dc.w 0
  1100.     dc.w 0
  1101.     dc.w 0
  1102.     dc.w 0
  1103.     dc.l 0
  1104.     dc.w 4
  1105.     dc.w 0
  1106.     dc.w 0
  1107.     dc.b 0
  1108.     dc.b 0
  1109.     dc.b 0
  1110.     dc.b 0
  1111.     dc.w 0
  1112.     dc.b 0
  1113.     dc.b 0
  1114.     dc.w 0
  1115.     dc.b 0
  1116.     dc.b 0
  1117.     dc.b 0
  1118.     dc.b 0
  1119.     dc.l 0
  1120.  
  1121.     even
  1122. QC_chan4:dc.l 0
  1123.     dc.l 0
  1124.     dc.w 0
  1125.     dc.w 0
  1126.     dc.w 0
  1127.     dc.w 0
  1128.     dc.w 0
  1129.     dc.l 0
  1130.     dc.w 8
  1131.     dc.w 0
  1132.     dc.w 0
  1133.     dc.b 0
  1134.     dc.b 0
  1135.     dc.b 0
  1136.     dc.b 0
  1137.     dc.w 0
  1138.     dc.b 0
  1139.     dc.b 0
  1140.     dc.w 0
  1141.     dc.b 0
  1142.     dc.b 0
  1143.     dc.b 0
  1144.     dc.b 0
  1145.     dc.l 0
  1146.  
  1147.     even
  1148. QC_data:                ;Your module here!
  1149.  
  1150.